package routers

import (
	_ "leeframe/docs"
	"leeframe/internal/controller"
	"leeframe/internal/middleware"
	"leeframe/internal/pkg/env"
	"leeframe/internal/pkg/logger"
	"time"

	// 由于github.com/gin-contrib/zap没有提供自定义fields的方法，所以这里复制了该包的代码，添加了自定义的fields
	"leeframe/internal/pkg/ginzap"

	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

// InitRouter initialize routing information
func InitRouter() *gin.Engine {
	r := gin.New()

	// 链路id记录
	r.Use(middleware.TraceLog())

	// 自定义跨域中间件
	r.Use(middleware.Cors())
	// 日志中间件：记录所有输出、请求
	r.Use(ginzap.Ginzap(logger.GetLogger(), time.RFC3339, true))
	// 日志中间件： 记录所有panic
	// - stack 是否记录堆栈
	// r.Use(ginzap.RecoveryWithZap(logger.GetLogger(), true))

	// 非生产环境提供swagger接口文档页面
	if env.Active().Value() != "pro" {
		// 注册路由
		r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
	}

	// 默认路由
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "Welcome to leeframe",
		})
	})

	// 测试路由
	ping := r.Group("/ping")
	{
		ping.GET("/", controller.Ping.Info)
		ping.GET("/mock", controller.Ping.InfoMock)
		ping.GET("/redis/mock", controller.Ping.PingRedisMock)
		ping.GET("/trace_log", controller.Ping.TraceLog)
	}

	// 接口分组路由
	api := r.Group("/api")

	// 请求头中间件
	// api.Use(middleware.HeaderInfo())

	// 用户
	user := api.Group("/user")
	{
		// 获取用户列表
		user.GET("/list", controller.User.List)
		// 获取用户详情
		user.GET("/info", controller.User.Info)
		// 创建用户
		user.POST("/create", controller.User.Create)
		// 删除用户
		user.POST("/delete", controller.User.Delete)
		// // 修改用户信息
		// user.POST("/update", controller.User.Update)
	}

	return r
}
